'''
对客户找到并提供的shp压缩包进行处理。提供文件本身以“code.zip”命名
1. 轮询提供的文件，将需要的文件，解压到临时目录。
2. 对临时文件夹压缩成zip文件，以code命名，并保存到目的文件夹中。
'''
import os
import shutil
from my_tools.shpfile_convert.utils.logger_util import log
from my_tools.shpfile_convert.utils.compress_util import makezip,unCompress

# 获取当前路径
cpath = os.getcwd()
# 原始文件的存放目录
ofpath = cpath+'\\gisfile\\old'
# 错误的文件存放目录
errpath = cpath+'\\gisfile\\err'
# 处理完成后文件的存放目录
nfpath = cpath+'\\gisfile\\new'

# 处理压缩文件
def getshpdir(file):
    temppath = ''
    needDetail = False
    # 抓取需要打包的文件到指定目录
    for dirpath,dirnames,filenames in os.walk(file):
        print(f"{dirpath}  {len(dirnames)}")
        if len(dirnames) > 1:
            dirstr = ''.join(dirnames)
            if '详细' not in dirstr:
                break
            else:
                needDetail = True
                continue
        if needDetail and '详细' not in dirpath:
            continue

        print(f"{needDetail} 路径：{dirpath}")

        # 如果该层级下没有文件，则寻找下一级
        if not filenames:
            continue
        # shp文件至少包含dbf、shp，shx、prj 4个文件
        fileliststr = ''.join(filenames)
        if '.dbf' in fileliststr and '.shp' in fileliststr and '.shx' in fileliststr and '.prj' in fileliststr:
            temppath = dirpath
        else:
            log.error('%s > 文件shp文件不完整，请检查' % file)
        break

    return temppath

# 计数
docount,notcount,skipcount=0,0,0

# 原文件列表
dirs = os.listdir(ofpath)
for code in dirs:
    try:
        # 以地块编码为zip文件名,看改文件是否已经转化过
        newzippath = os.path.join(nfpath, code+'.zip')
        if os.path.exists(newzippath):
            log.warning('【已处理】%s' % code)
            skipcount += 1
            continue

        # 判断筛选出的shp文件是否正确，不正确的记录到错误日志
        thisdir = os.path.join(ofpath,code)
        ziptemppath = getshpdir(thisdir)

        if ziptemppath != '':
            # 压缩为zip文件
            makezip(ziptemppath, newzippath)
            docount += 1
            log.info('【处理完成】%s' % code)
        else:
            shutil.copytree(thisdir, os.path.join(errpath, code))
            notcount += 1
    except Exception as e:
        log.error('【处理错误】%s, error: %s' % (code, e))
        continue

log.info('共处理文件%s个。成功转化%s个，失败%s个，已转化跳过%s个' % (len(dirs),docount,notcount,skipcount))